<?php
declare (strict_types=1);

namespace app\common\tool\Builder\Driver;

use think\Exception;
use think\facade\Cache;

class TableCache
{

    /**
     * @param $data
     * @param $key
     * 原点 2023年1月28日16:02:04 设置搜索内容
     */
    public function setData($data, $key)
    {
        Cache::set('tableCache_' . $key, $data);
    }

    /**
     * @return array
     * 原点 2023年1月28日16:02:46 获取搜索内容
     */
    public function getData($key = ''): array
    {
        return Cache::get('tableCache_' . $key);
    }

    /**
     * @param $key
     * @param $sort
     * @return array
     * 原点 2023年10月14日09:42:50 解析排序格式
     */
    public function getSort($key, $sort): array
    {
        $key = explode('_', $key);
        if (empty($sort) || count($key) < 3) return [];

        return !empty($sort[$key[2]]) && is_array($sort[$key[2]]) ? $sort[$key[2]] : $sort;
    }

    /**
     * @param $key
     * @param $field
     * @return mixed
     * @throws Exception
     * 原点 2023年1月28日16:02:46 获取表格Field字段
     */
    public function getTableField($key, $field = '')
    {
        $tableField = Cache::get('tableField_' . $key);
        if (empty($tableField)) {
            throw new Exception('未查询到当前表格的字段！');
        }
        if ($field) {
            foreach ($tableField as $item) {
                if ($item['field'] == $field) {
                    return $item;
                }
            }
            throw new Exception('未匹配到指定field字段');
        } else {
            return $tableField;
        }

    }

    /**
     * @param $key
     * @param $data
     * @return void
     * 原点 2023年2月21日09:37:05 设置当前表格Field字段
     */
    public function setTableField($key, $data)
    {
        Cache::set('tableField_' . $key, $data);
    }

    /**
     * @param $table
     * @param $key
     * @param $cache
     * @return array[]|mixed
     * 原点 2023年2月21日09:37:30 设置当前表格编辑/新增字段
     */
    public function setModify($table, $key, $cache = false)
    {
        if ($cache) {
            $result = Cache::get('modify_' . $key);
            if ($result) return $result;
        }
        $add = [];
        $edit = [];
        $field = [];
        $controller = "\app\\" . app('http')->getName() . "\\controller\\" . request()->controller();
        foreach ($table as $v) {
            if (!isset($v['field']) || !$v['field']) continue;
            $field[] = ['title' => $v['title'], 'field' => $v['field']];
            if (isset($v['modify'])) {
                $modify = explode(',', $v['modify']);
                $element = [
                    'mode'  => $modify[0],
                    'type'  => $modify[1],
                    'title' => $v['title'],
                    'field' => $v['field']
                ];
                if (in_array($modify[1], ['select', 'radio', 'checkbox'])) {
                    $action = $modify[2];
                    $element['value'] = $controller::$action();
                }
                if (in_array($modify[1], ['img', 'video', 'audio'])) {
                    $element['value'] = isset($modify[2]) ? $modify[2] : 1;
                }
                switch ($modify[0]) {
                    case 1:
                        $add[] = $element;
                        break;
                    case 2:
                        $add[] = $element;
                        $edit[] = $element;
                        break;
                    case 3:
                        $edit[] = $element;
                        break;
                    case 4:
                        $edit[] = $element;
                        break;
                }
            }
        }
        Cache::set('modify_' . $key, ['add' => $add, 'edit' => $edit]);
        $this->setTableField($key, $field);
        return ['add' => $add, 'edit' => $edit];
    }

    /**
     * @param $type
     * @param $key
     * @return array|mixed
     * 原点 2023年2月21日09:31:40 获取可编辑/添加字段
     */
    public function getModify($type = 'add', $key = ''): array
    {
        $key = $key ?: $this->getTableUniqueStr();
        $modify = Cache::get('modify_' . $key);
        return $modify && isset($modify[$type]) ? $modify[$type] : [];
    }

    /**
     * @return string
     * 原点 2023年2月21日09:38:29 获取当前访问url
     */
    public function getMethodUrl()
    {
        return strtolower(app('http')->getName() . '_' . request()->controller() . '_' . request()->action());
    }

    /**
     * @return array|mixed|string
     * 原点 2023年2月21日09:38:11 获取当前表格唯一的标识
     */
    public function getTableUniqueStr()
    {
        return request()->param('tableUniqueStr') ?: $this->getMethodUrl();
    }

    /**
     * @param $data
     * @param $key
     * 原点 2023年1月28日16:16:30 设置额外搜索内容
     */
    public function setExtraMap($data, $key)
    {
        Cache::set('tableExtraMap_' . $key, $data);
    }

    /**
     * @return array
     * 原点 2023年1月28日16:20:21 获取额外查询条件
     */
    public function getExtraMap(): array
    {
        return Cache::get('tableExtraMap_' . $this->getTableUniqueStr());
    }

}
